package field

import (
	"yunj/pkg/yunj/core/builder/builderdto"
	"yunj/pkg/yunj/core/builder/form"
)

// 下拉选择
type DropdownSearch struct {
	form.Field
	Multi      bool                `json:"multi"`      // 是否多选
	Options    []builderdto.Option `json:"options"`    // 可选数据
	OptionsApi string              `json:"optionsApi"` // 可选数据请求地址（优先级高于可选数据）
}

func NewDropdownSearch(id string, title ...string) *DropdownSearch {
	f := &DropdownSearch{}
	form.SetFieldInstance(&f.Field, f)
	f.SetFieldId(id)
	if len(title) > 0 {
		f.SetTitle(title[0])
	}
	return f
}

// 设置标题
func (f *DropdownSearch) SetTitle(title string) *DropdownSearch {
	f.Title = title
	return f
}

// 设置默认值
func (f *DropdownSearch) SetDefault(def any) *DropdownSearch {
	f.Default = def
	return f
}

// 设置描述
func (f *DropdownSearch) SetDesc(desc string) *DropdownSearch {
	f.Desc = desc
	return f
}

// 设置验证规则
func (f *DropdownSearch) SetVerify(rule string) *DropdownSearch {
	f.Verify = rule
	return f
}

// 设置验证标题
func (f *DropdownSearch) SetVerifyTitle(verifyTitle string) *DropdownSearch {
	f.VerifyTitle = verifyTitle
	return f
}

// 增加验证规则
func (f *DropdownSearch) AddVerify(rule string) *DropdownSearch {
	f.AddFieldVerify(rule)
	return f
}

// 设置是否只读
func (f *DropdownSearch) SetReadonly(yes bool) *DropdownSearch {
	f.Readonly = yes
	return f
}

// 设置栅格布局
// 超小屏幕(手机<768px)、小屏幕(平板≥768px)、中等屏幕(桌面≥992px)、大型屏幕(桌面≥1200px)、超大屏幕(桌面≥1400px)
// 总列数：12
func (f *DropdownSearch) SetGrid(num ...any) *DropdownSearch {
	f.Grid = num
	return f
}

// 设置权限
func (f *DropdownSearch) SetAuth(auth string) *DropdownSearch {
	f.Auth = auth
	return f
}

// 设置是否多选
func (f *DropdownSearch) SetMulti(multi bool) *DropdownSearch {
	f.Multi = multi
	return f
}

// 设置可选数据
func (f *DropdownSearch) SetOptions(options []builderdto.Option) *DropdownSearch {
	f.Options = options
	return f
}

// 设置可选数据请求地址（优先级高于可选数据）
func (f *DropdownSearch) SetOptionsApi(api string) *DropdownSearch {
	f.OptionsApi = api
	return f
}

// 处理属性
func (f *DropdownSearch) HandleAttr() error {
	if (f.Options == nil || len(f.Options) <= 0) && f.OptionsApi == "" {
		return f.SetError("选项 Options和OptionsApi 未配置！")
	}
	return nil
}
